Unity Shader Graph 漫游解析 (五) 阴影、多Pass |
您所在的位置:网站首页 › unity shader 阴影 › Unity Shader Graph 漫游解析 (五) 阴影、多Pass |
五、阴影投射阴影 投射阴影需要有 ShadowCaster Pass,来生成 ShadowMap,并且为了避免自阴影尖刺,在生成 Shadow Map 时需要对 物体顶点做偏移 并且这里对于不同的平台,我们还需要做 RESVERSE_Z 判断 光源通过这个Pass 得到 物体在光源投影空间的深度值,并输出到 Shadow Map, 片元着色器的输出并没有被使用。该 Pass 的片元输出也不会写入帧缓冲,所以这个 Blend 删掉也可以,ShaderGraph 生成的 Shader 是带有的。 效果: 接收阴影要接收阴影就需要计算 shadowCoord,即 Shadow Map 的 UV Shadow Map 是在屏幕空间的, 如果只有一个级联,那么直接生成齐次坐标即可,但是如果是多个级联,则屏幕被分成多个部分,且每个级联的光源远近不同(Shadow Map 的精度不同) 即 光源投影空间转换矩阵也不同。这也意味着阴影投射的 DrawCall数为 投影光源数 级联数 投影物体数 所以还需要计算 级联下标。 这里直接使用 TransformWorldToShadowCoord API: 效果: 可以看到,立方体接收了球的阴影 另外这里 shadowCoord 是在顶点计算的,如果级联数为 4 的话,那么会有 Bug,此时要在片元里面计算 shadowCoord: 关于阴影投射时的顶点片元,可以在管线设置中设置偏移量: 也可以给某些灯光单独设置偏移: 附加光源阴影URP 中只有 方向光 和 聚光灯 是参与实时 Shadow Map 计算的,对于点光源 则需要设置为 烘焙光,烘焙 离线的 Shadow Map 附加光源的阴影衰减在 GetAdditionalLight 时就已经计算了(同样是采样 Shadow Map 计算光源投影空间深度 然后比较)。 所以直接把附加阴影结果乘上阴影衰减即可: 在 管线设置中 可以关闭 附加光源的阴影投射,这也 URP 会通过宏定义 在编译时去掉附加光源阴影计算部分 自定义阴影颜色会发现,物体在自己身上也会有阴影,这个问题在默认管线中也有,如果把 偏移设置的非常大,则这部分自阴影会消失,但是产生的阴影也会有较大的偏差。 所以要自定义阴影颜色可以使用 Projector 组件,不过 URP 是不支持 Projector 组件的。 六、多 Pass在 URP 刚出来时,想要进行多 Pass 渲染,需要通过 RenderFeature 来进行,较为复杂。 在 新的 URP 中,多 Pass 仍然通过 RenderFeature 来进行,但是对一块做了优化,现在多 Pass 非常简单。 以描边 和 透视 Pass 为例,我们现在 Shader 中写出这两个 Pass,注意!一定要给 Pass 赋予自定义的 LightMode: 描边 Pass: 透视 Pass: 之后,我们找到 管线设置,其引用了一个 ForwardRender: 找到 这个 ForwardRender: 其下面有一个 Add Renderer Feature 按钮,点击 只能添加一种 RenderFeature。 Render Feature 我们可以自定义其它种类 来实现各种 后处理 或 多Pass 效果,但对于一般的 多Pas,我们用默认的即可, Event 表示该 Render Feature 作用的时机,可以用做 后处理阶段,也可以在 透明物体渲染前应用 等等,这里就在 不透明物体渲染之后调用吧(因为我们需要 不透明物体写入的深度) Layer Mask 表示那个 Layer 下的物体会受其作用,我们将其设置为 Everything LightMode Tags 就是用来指定我们的 多Pass的,前面我们定义 Pass 的时候 已经定义了 LightMode 名字,这里直接给上即可: 调整材质的属性: 场景中使用该材质的物体,就应用了 这两个 Pass: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |